import axios from 'axios'
import router from '@/router'
import { Message } from 'element-ui'

// 创建一个axios实例
const service = axios.create({
  // 使用完整的API服务器地址
  baseURL: process.env.VUE_APP_API_SERVER,
  timeout: 15000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求前可以做一些处理
    
    // 添加token到请求头
    const accessToken = localStorage.getItem('access_token')
    const tokenType = localStorage.getItem('token_type')
    
    if (accessToken && tokenType) {
      // 格式：{token_type} {access_token}
      config.headers['Authorization'] = `${tokenType} ${accessToken}`
    }
    
    return config
  },
  error => {
    // 处理请求错误
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果您想获取http信息，如头信息或状态信息
   * 请return response => response
  */
  response => {
    const res = response.data

    // 根据自定义错误码判断请求是否成功
    if (res.code && res.code !== 200) {
      // 处理各种错误情况
      switch (res.code) {
        case 401:
          // 未授权，跳转到登录页面
          Message.error('登录已过期，请重新登录')
          localStorage.removeItem('access_token')
          localStorage.removeItem('token_type')
          localStorage.removeItem('isLoggedIn')
          router.push('/login')
          break
        case 403:
          Message.error('没有权限访问该资源')
          break
        case 500:
          Message.error('服务器内部错误')
          break
        default:
          Message.error(res.message || '未知错误')
      }
      
      return Promise.reject(res)
    } else {
      return res
    }
  },
  error => {
    // 处理http层面的错误
    let message = '请求错误'
    
    if (error.code === 'ECONNABORTED' || error.code === 'ERR_NETWORK') {
      message = '网络连接失败，请检查您的网络'
    } else if (error.response) {
      // 服务器响应了，但状态码超出了2xx范围
      const status = error.response.status
      
      switch (status) {
        case 400:
          message = '请求错误(400)'
          break
        case 401:
          message = '未授权，请重新登录'
          // 清除token并跳转到登录页
          localStorage.removeItem('access_token')
          localStorage.removeItem('token_type')
          localStorage.removeItem('isLoggedIn')
          router.push('/login')
          break
        case 403:
          message = '拒绝访问(403)'
          break
        case 404:
          message = '请求的资源不存在(404)'
          break
        case 500:
          message = '服务器错误(500)'
          break
        default:
          message = `请求失败(${status})`
      }
    } else {
      message = '请求失败，请稍后再试'
    }
    
    Message.error(message)
    console.error('响应错误: ', error)
    return Promise.reject(error)
  }
)

export default service 